import { constantRoutes, asyncRoutes, errorRoutes } from '@/router'

//vuex权限模块--permission：权限，许可证
const state = {
    //最终结果，渲染左侧菜单用
    routes: [],
    addRoutes: [], //计算好的动态路由
    isGetUserInfo: false, //是否获取用户信息，获取的token是否正确
}

//计算单个路由是否有权限
/**
 * @param { any }route 单个路由对象
 * @param {string} role 角色
 * @description 计算单个路由是否有权限
 * @returns {boolean}
 */
const hasPermission = (route, role) => {
    //判断当前路由是否有roles字段
    if (route.meta && route.meta.roles) {
        //如果用户的某个role命中此路由的roles， 那就有权限
        return route.meta.roles.includes(role)
    } else {
        // 如果route没有包含meta，就默认有权限
        return true
    }
}

//计算动态路由权限函数
const filterAsyncRoutes = (routes, role) => {
    let temp = []
    routes.forEach(route => {
            if (hasPermission(route, role)) {
                // 如果有权限，则判断是否有children
                if (route.children && route.children.length) {
                    // 如果有children，则遍历children，过滤出有权限的children
                    route.children = filterAsyncRoutes(route, children, role)
                }
                // 将过滤出来的有权限的路由放到res数组中
                temp.push(route)
            }
        })
        // 返回过滤出来的路由
    return temp
}
const mutations = {
    ADD_ROUTES(state, routes) {
        //把静态路由 和 计算好的动态路由 合并给左侧菜单使用
        state.routes = [...constantRoutes, ...routes]
    },

    //设置用户信息状态
    SET_USERINFO_STATE(state, flag) {
        state.isGetUserInfo = flag
    },
}
const actions = {
    //生成动态路由函数
    generateRoutes({ commit }, role) {
        return new Promise(resolve => {
            //筛选出可使用的动态路由
            let accessRoutes = filterAsyncRoutes(asyncRoutes, role)

            //把accessRoutes存进vuex
            commit('ADD_ROUTES', accessRoutes)

            //把筛选好的动态路由 和 错误路由 抛出去 给router.addRoutes
            resolve([...accessRoutes, ...errorRoutes])
        })
    },
}
export default {
    namespaced: true,
    state,
    mutations,
    actions,
}